package com.sinopec.basemodule.utils.kotlin

import com.alibaba.android.arouter.core.LogisticsCenter
import com.alibaba.android.arouter.launcher.ARouter
import com.sinopec.basemodule.common.Logger
import com.sinopec.basemodule.constants.PreferencesConstant
import com.sinopec.basemodule.utils.kotlin.bean.TextMoreStyle
import java.math.RoundingMode
import java.text.DecimalFormat

/**
 * 类描述：String扩展类<br/>
 * 创建人：lwj<br/>
 * 创建时间：2019/6/25 14:11 <br/>
 */
fun String?.parseInt(): Int {
    if (this.isNullOrEmpty()) {
        return 0
    }
    return try {
        this.toInt()
    } catch (e: Exception) {
        Logger.w("123===", this + "-->String转换Int异常=" + e.message)
        0
    }
}

fun String?.parseDouble(): Double {
    if (this.isNullOrEmpty()) {
        return 0.0
    }
    return try {
        this.toDouble()
    } catch (e: Exception) {
        Logger.w("123===", this + "-->String转换Int异常=" + e.message)
        0.0
    }
}

/**
 * 格式化数字升级版
 * @param dot 保留小数点位数
 * @param isShowEnd0 是否显示末尾0
 * @param roundingMode 四舍五出模式
 */
@JvmOverloads
fun String?.formatNumber(dot: Int, isShowEnd0: Boolean = false, roundingMode: RoundingMode = RoundingMode.FLOOR): String {
    val patternSb = StringBuilder("0")
    for (i in 0 until dot) {
        if (i == 0) {
            patternSb.append(".")
        }
        if (isShowEnd0) {
            patternSb.append("0")
        } else {
            patternSb.append("#")
        }
    }
    return this.formatNumber(patternSb.toString(), roundingMode)
}

/**
 * 格式化数字
 * ##0.000
 * @param roundingMode 四舍五出模式
 */
@JvmOverloads
fun String?.formatNumber(formatStr: String = "#,##0.####", roundingMode: RoundingMode = RoundingMode.FLOOR): String {
    val df = DecimalFormat(formatStr)
    df.roundingMode = roundingMode
    if (this.isNullOrEmpty()) {
        return df.format(0)
    }
    val numberD: Double
    try {
        numberD = this.toDouble()
    } catch (e: Exception) {
        return df.format(0)
    }
    return df.format(numberD)
}

/**
 * string 转换为中英文数组 设置到富文本中
 */
fun String?.toZhEnSpan(zhTextSizePx: Int, enTextSizePx: Int): Array<TextMoreStyle> {
    if (this.isNullOrEmpty()) {
        return arrayOf()
    }
    val enStr = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&*()-=_+`~[]{}\\|;':\",./<>?"
    val result = mutableListOf<TextMoreStyle>()
    val sb = StringBuilder()
    //0：正在遍历中文；1：正在遍历英文
    var oldForType = 0
    val toCharArray = this.toCharArray()
    for (indexValue in toCharArray.withIndex()) {
        val c = indexValue.value
        val oldIsEn = oldForType != 0
        if (enStr.contains(c)) {
            //当前字母是英文
            if (oldIsEn) {
                //原来是英文
                sb.append(c)
            } else {
                //原来是中文
                addZhEnSpanType2Array(sb, zhTextSizePx, result)
                sb.append(c)
                oldForType = 1
            }
            if (indexValue.index == toCharArray.size - 1) {
                addZhEnSpanType2Array(sb, enTextSizePx, result)
            }
        } else {
            //当前字母是中文
            if (oldIsEn) {
                //原来是英文情况
                addZhEnSpanType2Array(sb, enTextSizePx, result)
                sb.append(c)
                oldForType = 0
            } else {
                //原来是中文
                sb.append(c)
            }
            if (indexValue.index == toCharArray.size - 1) {
                addZhEnSpanType2Array(sb, zhTextSizePx, result)
            }
        }
    }
    return result.toTypedArray()
}

/**
 * 添加中英文字体大小富文本 进出数组
 */
private fun addZhEnSpanType2Array(sb: StringBuilder, zhTextSizePx: Int, result: MutableList<TextMoreStyle>) {
    val sbStr = sb.toString()
    if (sbStr.isNotEmpty()) {
        val zhTextMoreStyle = TextMoreStyle.builder(sbStr)
                .setTextSize(zhTextSizePx)
                .build()
        result.add(zhTextMoreStyle)
        sb.setLength(0)
    }
}

/**
 * 加密手机号
 */
fun String?.encryptPhoneNumber(): String {
    if (this.isNullOrEmpty()) {
        return ""
    }
    return if (this.validationPhoneNumber()) {
        this.replace("((\\d{3})\\d{4}(\\d{4}))".toRegex(),"$2****$3")
    } else {
        this
    }
}
//////////////////////////////////////////验证账号////////////////////////////////////////////////////////////
/**
 * 验证法人
 */
fun String?.verificationLegalPerson(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }

    return this.matches("^(?![ ]{1,10}$)[\\u4e00-\\u9fa5A-Za-z （）()]{1,10}$".toRegex())
    //仅中文，大小写英文以及空格， 2≤字符长度≤50字。 不能全空
    //return this.matches("^(?![ ]{2,50}$)[\\u4e00-\\u9fa5A-Za-z ]{2,50}$".toRegex())
}

/**
 * 验证是否是有效税号
 */
fun String?.verificationTaxId(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }

    return this.matches("^[a-zA-z\\d]{1,100}$".toRegex())

    /*
    1)	仅允许输出大写英文字母以及数字
    2)	不能包含以下大写字母（政府规定）：IOZSV；
    3)	字符长度：15、17、18、20位；大写字母+数字；超出或输出不合规则字符
     */
    //return this.matches("(?=^.{15}$|^.{17}$|^.{18}$|^.{20}$)^[QWERTYUPADFGHJKLXCBNM\\d]{15,20}$".toRegex())
}

/**
 * 验证公司名
 */
fun String?.verificationCompanyName(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }

    if (this.length > 100) {
        return false
    }
    return true

    //允许中、英文大小写以及标点符号 (.&/)，不允许仅标点符号。
    //2≤字符长度≤50
    //return this.matches("^(?![.&/)]{2,50}$)[\\u4e00-\\u9fa5A-Za-z.&/]{2,50}$".toRegex())
}

/**
 * 验证车船号是否正确，正常7位；新能源车牌8位
 */
fun String?.validationCardNumber(): Boolean {
    if (this.isNullOrEmpty()
            || this.length < 7) {
        return false
    }
    val reg = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]{1}$"
    return this.matches(reg.toRegex())
}

/**
 * 验证密码长度 8-16位
 */
fun String?.validationPasswordLength(): Boolean {
    if (this.isNullOrEmpty()
            || this.length < 8
            || this.length > 16
    ) {
        return false
    }
    return true
}

/**
 * 验证密码
 */
fun String?.validationPassword(): Boolean {
    if (!this.validationPasswordLength()) {
        return false
    }
    val reg = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$"
    return this!!.matches(reg.toRegex())
}

/**
 * rfid规则验证
 */
fun String?.validationRfidRule(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }
    val replace = this.replace(" ".toRegex(), "")
    val rfidRegex = PreferencesConstant.getInstance().rfid_regex
    return replace.matches(rfidRegex.toRegex())
}

/**
 * 验证手机号
 */
fun String?.validationPhoneNumber(): Boolean {
    if (this.isNullOrEmpty()) {
        return false
    }
    val reg = "1\\d{10}"
    return this.matches(reg.toRegex())
}
//////////////////////////////////////////验证账号---END---////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
/**
 * 验证车船号是否正确，正常7位；新能源车牌8位
 */
fun String?.verificationCarNumber(): Boolean {
    if (this.isNullOrEmpty()
        || this.length < 7) {
        return false
    }
    val reg = "^[冀豫云辽黑湘皖鲁苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼渝京津沪新军空海北沈兰济南广成使领]{1}[A-Z]{1}[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]{1}$"
    return this.matches(reg.toRegex())
}


/**
 * create by lwj at 2023/2/8
 * 字符串转 class
 * 如果出现 闪退 可能是 没有把module打包进app
 */
val String.navigationClass: Class<*>
    get() {
        val postCard = ARouter.getInstance().build(this)
        LogisticsCenter.completion(postCard)
        return postCard.destination
    }